﻿using System;
using System.Web.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace DevMed.Library
{
    /// <summary>
    /// Principais comandos que podem ser executados pelas procedures.
    /// </summary>
    public enum Comandos
    {
        Insere,
        Altera,
        Exclui,
        Seleciona,
        SelecionaTodos,
        GetClinica
    }

    /// <summary>
    /// Classe responsável por configurar a conexão
    /// e executar comandos no servidor SqlServer.
    /// </summary>
    public class Conexao
    {
        private string _stringConexao;
        private SqlConnection _connection;
        private SqlCommand _command;
        private string _nomeTabela;

        /// <summary>
        /// Construtor padrão da classe.
        /// </summary>
        /// <param name="pNomeTabela">Nome da tabela que vai executar o comando.</param>
        public Conexao(string pNomeTabela)
        {
            _stringConexao = WebConfigurationManager.ConnectionStrings["BancoDadosDevMed"].ToString();

            _connection = new SqlConnection();
            _connection.ConnectionString = _stringConexao;

            _command = new SqlCommand();
            _command.Connection = _connection;
            _command.CommandType = CommandType.StoredProcedure;

            _nomeTabela = pNomeTabela;
        }

        /// <summary>
        /// Adiciona um parâmetro ao SqlCommand da classe.
        /// Nã é necessário informar o @P_, pois ele já é configurado pelo próprio método.
        /// </summary>
        /// <param name="pNome">Nome do parâmetro, não é necessário informar o @P_.</param>
        /// <param name="pValor">Valor do parâmetro, que está vindo da interface.</param>
        public void AdicionaParametro(string pNome, object pValor)
        {
            _command.Parameters.AddWithValue("@P_" + pNome, pValor);
        }

        /// <summary>
        /// Executa um determinado comando no SqlServer sem retorno.
        /// Usado para Insert, Update e Delete.
        /// </summary>
        /// <param name="pComando">Nome do comando a ser executado.</param>
        public void Executa(string pComando)
        {
            _connection.Open();
            _command.CommandText = _nomeTabela + "_" + pComando;
            _command.ExecuteNonQuery();
        }

        /// <summary>
        /// Executa um determinado comando no SqlServer sem retorno.
        /// Usado para Insert, Update e Delete.
        /// </summary>
        /// <param name="pEnumComandos">Tipo de comando que vai ser executado, usar enum Comandos.</param>
        public void Executa(Comandos pEnumComandos)
        {
            Executa(pEnumComandos.ToString());
        }

        /// <summary>
        /// Executa um determinado comando no SqlServer sem retorno.
        /// Usado para Insert, Update e Delete.
        /// </summary>
        /// <param name="pComando">Nome do comando a ser executado.</param>
        public SqlDataReader ExecutaSelect(string pComando)
        {
            _connection.Open();
            _command.CommandText = _nomeTabela + "_" + pComando;
            return _command.ExecuteReader();
        }

        /// <summary>
        /// Executa um determinado comando no SqlServer sem retorno.
        /// Usado para Insert, Update e Delete.
        /// </summary>
        /// <param name="pEnumComandos">Tipo de comando que vai ser executado, usar enum Comandos.</param>
        public SqlDataReader ExecutaSelect(Comandos pEnumComandos)
        {
            return ExecutaSelect(pEnumComandos.ToString());
        }
    }
}